#include <stdlib.h>
#include <string.h>

#include "dstring.h"

DString* dstring(char *str)
{
	DString *dstr;
	int len;
	if (!str)
		return NULL;
	len = strlen(str);
	dstr = calloc(1, sizeof(DString));
	assert(dstr);
	dstr->buf = malloc(len + 1);
	assert(dstr->buf);
	dstr->buf_size = len + 1;
	dstr->str_size = len;
	memcpy(dstr->buf, str, len + 1);
	return dstr;
}

void dstring_free(DString *dstr)
{
	free(dstr->buf);
	free(dstr);
}

DString* dstring_append(DString *dstr, char *str)
{
	int len;
	len = strlen(str);
	if (dstr->buf_size - dstr->str_size - 1 < len) {
		dstr->buf = realloc(dstr->buf, dstr->buf_size * 2);
		assert(dstr->buf);
		dstr->buf_size *= 2;
	}
	memcpy(dstr->buf + dstr->str_size, str, len + 1);
	return dstr;
}
